<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //闭包案例
        function fun(){
            var name="慕课网";
            function innerFun(){
                alert(name);
            }
            return innerFun;
        }
        var name="ABC"
        var inn=fun();
        inn();// “慕课网"  将fun()的内部函数移到fun()的外部运行，虽然name不是全局变量，但仍然有效,就算全局有name，也不用全局的name    

        //什么是闭包。闭包是函数本身和函数声明时所处的环境状态的组合。
        //函数能够记忆住其定义时所处的环境，即使函数不在其定义的环境中被调用，也能访问定义时所处环境的变量
        //什么时候有闭包。每次创建函数时都会创建闭包
        //闭包怎么观察。闭包特性往往在函数换一个地方运行时，才能被观察出来。
        //闭包的实用性。闭包允许我们将数据和操作该数据的函数关联起来。
        //闭包的功能。记忆性，模拟私有变量

        //不能滥用闭包，否则会造成网页性能问题，严重时可能会导致内存泄露，即程序中已动态分配的内存由于某种原因无法释放或未释放

        //闭包经典面试题
        function addCount(){
            var count=0;
            return function(){
                count=count+1;
                console.log(count)
            }
        }
        var fun1=addCount()
        var fun2=addCount()
        fun1()//1
        fun2()//1
        fun2()//2
        fun1()//2
    </script>
</body>
</html>